package com.laurent.brewerhistory.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class PatternUtil {

	public static final String FORMAT_DDMMYYYYHHMMSS = "dd-MM-yyyy hh:mm";

	/**
	 * Mise à jour d'une préférence
	 * 
	 * @param context Le contexte de l'application
	 * @param key La clé de la préférences à setter
	 * @param value La valeur de la préférences à setter
	 */
	public static void setPreferences(Context context, String key, String value) {
		// on récupère les SharedPreferences de l'appli
		SharedPreferences settings = context.getSharedPreferences(
				context.getPackageName(), Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.putString(key, value);
		// Commit the edits!
		editor.commit();
	}

	/**
	 * Suppression d'une référence dans les sharedPreferences
	 * 
	 * @param context Le context pour accéder aux sharedPreferences
	 * @param key La clé des préférences que l'on veut enlever
	 */
	public static void removePreference(Context context, String key) {
		// on récupère les SharedPreferences de l'appli
		SharedPreferences settings = context.getSharedPreferences(
				context.getPackageName(), Context.MODE_PRIVATE);
		Editor editor = settings.edit();
		editor.remove(key);
		// Commit the edits!
		editor.commit();
	}

	/**
	 * récupération d'une préférence
	 * 
	 * @param context Le contexte de l'application
	 * @param key La clé de la préférences à recupérer
	 * @return La valeur de la préférences, "" sinon
	 */
	public static String getPreferences(Context context, String key) {
		return getPreferences(context, key, "");
	}

	/**
	 * récupération d'une préférence
	 * 
	 * @param context Le contexte de l'application
	 * @param key La clé de la préférences à recupérer
	 * @return La valeur de la préférences
	 */
	public static String getPreferences(Context context, String key,
			String defaut) {
		try {
			// on récupère les SharedPreferences de l'appli
			SharedPreferences settings = context.getSharedPreferences(
					context.getPackageName(), Context.MODE_PRIVATE);
			return settings.getString(key, defaut);
		} catch (Exception e) {
			return defaut;
		}
	}

	/**
	 * Méthode permettant de vérifier si une chaine n'est ni nulle ni vide
	 * 
	 * @param str Chaine a vérifier
	 * @return True ==> Chaine vide ou nulle
	 */
	public static Boolean isEmpty(String str) {
		return str == null || "".equals(str) || "null".equalsIgnoreCase(str);
	}

	/**
	 * Méthode permettant de vérifier si une chaine n'est ni nulle ni vide
	 * 
	 * @param obj Objet a vérifier
	 * @return True ==> Chaine vide ou nulle
	 */
	public static Boolean isEmpty(Object obj) {
		return obj == null;
	}

	/**
	 * Méthode permettant de vérifier si une chaine n'est ni nulle ni vide
	 * 
	 * @param obj Objet a vérifier
	 * @return True ==> Chaine vide ou nulle
	 */
	public static Boolean isEmpty(List<?> obj) {
		return obj == null || obj.isEmpty();
	}

	/**
	 * Formattage de la date suivant le pattern suivant : dd/MM/yyyy
	 * 
	 * @param date La date à formater
	 * @return La date au format dd/MM/yyyy ou "" si date==null
	 */
	public static String formatDate(Date date) {
		return formatDate(date, "dd/MM/yyyy");
	}

	/**
	 * Formattage de la date suivant le pattern spécifié
	 * 
	 * @param date La date à formater
	 * @param pattern Le pattern de formatage de la date
	 * @return La date au pattern choisi ou "" si date==null
	 */
	public static String formatDate(Date date, String pattern) {
		SimpleDateFormat f = new SimpleDateFormat(pattern, Locale.FRANCE);
		return date != null ? f.format(date) : "";
	}

	/**
	 * Reformattage d'une date suivant le pattern dd/MM/yyyy
	 * 
	 * @param date La chaine de caractère à transformer en date
	 * @return L'objet date correspondant sinon null
	 */
	public static Date formatDate(String date) {
		return formatDate(date, "dd/MM/yyyy");
	}

	/**
	 * Reformattage d'une date suivant le pattern renseigné
	 * 
	 * @param date La chaine de caractère à transformer en date
	 * @param pattern Le pattern a respecter pour la date
	 * @return L'objet date correspondant sinon null
	 */
	public static Date formatDate(String date, String pattern) {
		SimpleDateFormat f = new SimpleDateFormat(pattern, Locale.FRANCE);
		try {
			return f.parse(date);
		} catch (ParseException e) {
			// la chaine de caractère ne contient pas de date au pattern demandé
			return null;
		}
	}
}
